:- static([adr,input,input2,input3,reg1,reg2,reg3,reg4,cnt,output]).
:- static(memory).
r_0start0(A,B) :- main(A,B).
r_0start0($(A,B,C,D)) :- r_subFin(C,D),r_0start0(A,B).
r_0start0($(A,B,C,D)) :- r_subNotFin(r_0start0(E,F),r_0start0($(G,H,I,J)),$(G,H,I,J),A,B,C,D).
start(A,B) :- r_subBegin(A,C,D,E),!,init(D,F),r_notEmpty(F),r_0start0($(A,B,C,F)).
init(A,A) :- A = ['$t'(B,C,D,$(E,F,G))|H],r_set_value(memory(1),1,F),r_set_value(memory(2),2,F),r_set_value(memory(3),3,F),r_set_value(memory(4),4,F),r_set_value(memory(5),5,F),r_set_value(memory(6),6,F),r_set_value(memory(7),7,F),r_set_value(adr,1,F).
r_0input0(A,B,reg1,B,C,D) :- r_read_value(input,A),B is 0.222222 + 0.888889 * A,r_assign(reg1,B,C,D).
r_0input0(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_0input0(A,B,C,D,E,F).
r_0input0(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_0input0(A,B,C,D,M,N),r_0input0(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
input(A,B) :- r_subBegin(A,C,D,E),!,r_read_value(adr,F),r_read_value(memory(F),G),H = input,I = G,r_assign(H,I,D,J),r_read_value(adr,K),L is K + 1,M = adr,N = L,r_assign(M,N,J,O),r_notEmpty(O),r_0input0(P,Q,R,S,$(A,B,C,O)).
main(A,A) :- r_read_value(adr,8),!.
r_2main0($(A,B,C,D)) :- r_subFin(C,D),r_2main0(A,B).
r_2main0($(A,B,C,D)) :- r_subNotFin(r_2main0(E,F),r_2main0($(G,H,I,J)),$(G,H,I,J),A,B,C,D).
r_3main0(A,B) :- r_subBegin(A,C,D,E),stage1(D,F),r_notEmpty(F),r_2main0($(A,B,C,F)).
r_1main0($(A,B,C,D)) :- r_subFin(C,D),r_1main0(A,B).
r_1main0($(A,B,C,D)) :- r_subNotFin(r_1main0(E,F),r_1main0($(G,H,I,J)),$(G,H,I,J),A,B,C,D).
r_2main0(A,B) :- main(A,C),r_subBegin(C,D,E,F),stage2(E,G),r_notEmpty(G),r_1main0($(C,B,D,G)).
r_0main0($(A,B,C,D)) :- r_subFin(C,D),r_0main0(A,B).
r_0main0($(A,B,C,D)) :- r_subNotFin(r_0main0(E,F),r_0main0($(G,H,I,J)),$(G,H,I,J),A,B,C,D).
r_1main0(A,B) :- r_subBegin(A,C,D,E),last_stage(D,F),r_notEmpty(F),r_0main0($(A,B,C,F)).
r_0main0(A,A).
r_3main0($(A,B,C,D)) :- r_subFin(C,D),r_3main0(A,B).
r_3main0($(A,B,C,D)) :- r_subNotFin(r_3main0(E,F),r_3main0($(G,H,I,J)),$(G,H,I,J),A,B,C,D).
main(A,B) :- r_subBegin(A,C,D,E),!,input(D,F),r_notEmpty(F),r_3main0($(A,B,C,F)).
r_3stage10(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_3stage10(A,B,C,D,E,F).
r_3stage10(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_3stage10(A,B,C,D,M,N),r_3stage10(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
r_4stage10(A,B,C,D,E,F) :- ulist(D,reg2,G),ulist(G,C,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1],T),r_subBegin(E,J1,K1,L1),r_read_value(reg2,A),r_read_value(reg1,B),C is A + B,r_assign(reg2,C,K1,M1),r_notEmpty(M1),r_3stage10(I,K,M,[O,Q,S,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1],$(E,F,J1,M1)).
r_2stage10(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_2stage10(A,B,C,D,E,F).
r_2stage10(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_2stage10(A,B,C,D,M,N),r_2stage10(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
r_3stage10(A,B,reg1,C,D,E) :- ulist(C,B,F),ulist(F,G,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U,V,W,X,Y,Z,A1,B1,C1,D1],T),r_subBegin(D,E1,F1,G1),r_read_value(reg2,A),B is A / 2,r_assign(reg1,B,F1,H1),r_notEmpty(H1),r_2stage10(G,I,K,[M,O,Q,S,U,V,W,X,Y,Z,A1,B1,C1,D1],$(D,E,E1,H1)).
r_1stage10(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_1stage10(A,B,C,D,E,F).
r_1stage10(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_1stage10(A,B,C,D,M,N),r_1stage10(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
r_2stage10(A,B,C,D,E,F) :- ulist(D,reg2,G),ulist(G,C,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U,V,W,X,Y,Z],T),r_subBegin(E,A1,B1,C1),r_read_value(input2,A),r_read_value(reg1,B),C is A / B,r_assign(reg2,C,B1,D1),r_notEmpty(D1),r_1stage10(I,K,M,[O,Q,S,U,V,W,X,Y,Z],$(E,F,A1,D1)).
r_0stage10(A,B,C,D,E,F,G,$(H,I,J,K)) :- r_subFin(J,K),r_0stage10(A,B,C,D,E,F,G,H,I).
r_0stage10(A,B,C,D,E,F,G,$(H,I,J,K)) :- unifyNext(A,L),unifyNext(B,M),unifyNext(C,N),unifyNext(D,O),unifyNext(E,P),unifyNext(F,Q),unifyNext(G,R),r_subNotFin(r_0stage10(A,B,C,D,E,F,G,S,T),r_0stage10(L,M,N,O,P,Q,R,$(U,V,W,X)),$(U,V,W,X),H,I,J,K).
r_1stage10(A,B,C,D,E,F) :- ulist(D,reg2,G),ulist(G,C,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U],T),r_subBegin(E,V,W,X),r_read_value(reg2,A),r_read_value(reg1,B),C is A + B,r_assign(reg2,C,W,Y),r_notEmpty(Y),r_0stage10(I,K,M,O,Q,S,U,$(E,F,V,Y)).
r_0stage10(A,B,reg3,B,C,input3,C,D,E) :- r_read_value(reg2,A),B is A / 2,r_assign(reg3,B,D,F),r_read_value(input2,C),r_assign(input3,C,F,E).
r_4stage10(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_4stage10(A,B,C,D,E,F).
r_4stage10(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_4stage10(A,B,C,D,M,N),r_4stage10(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
stage1(A,B) :- r_subBegin(A,C,D,E),r_read_value(input,F),r_read_value(reg1,G),H is F / G,r_assign(reg2,H,D,I),r_read_value(input,J),r_assign(input2,J,I,K),r_notEmpty(K),r_4stage10(L,M,N,[O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1],$(A,B,C,K)).
r_3stage20(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_3stage20(A,B,C,D,E,F).
r_3stage20(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_3stage20(A,B,C,D,M,N),r_3stage20(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
r_4stage20(A,B,C,D,E,F) :- ulist(D,reg4,G),ulist(G,C,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1],T),r_subBegin(E,G1,H1,I1),r_read_value(reg4,A),r_read_value(reg3,B),C is A + B,r_assign(reg4,C,H1,J1),r_notEmpty(J1),r_3stage20(I,K,M,[O,Q,S,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1],$(E,F,G1,J1)).
r_2stage20(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_2stage20(A,B,C,D,E,F).
r_2stage20(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_2stage20(A,B,C,D,M,N),r_2stage20(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
r_3stage20(A,B,reg3,C,D,E) :- ulist(C,B,F),ulist(F,G,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U,V,W,X,Y,Z,A1],T),r_subBegin(D,B1,C1,D1),r_read_value(reg4,A),B is A / 2,r_assign(reg3,B,C1,E1),r_notEmpty(E1),r_2stage20(G,I,K,[M,O,Q,S,U,V,W,X,Y,Z,A1],$(D,E,B1,E1)).
r_1stage20(A,B,C,D,E,F,G,H,I,$(J,K,L,M)) :- r_subFin(L,M),r_1stage20(A,B,C,D,E,F,G,H,I,J,K).
r_1stage20(A,B,C,D,E,F,G,H,I,$(J,K,L,M)) :- unifyNext(A,N),unifyNext(B,O),unifyNext(C,P),unifyNext(D,Q),unifyNext(E,R),unifyNext(F,S),unifyNext(G,T),unifyNext(H,U),unifyNext(I,V),r_subNotFin(r_1stage20(A,B,C,D,E,F,G,H,I,W,X),r_1stage20(N,O,P,Q,R,S,T,U,V,$(Y,Z,A1,B1)),$(Y,Z,A1,B1),J,K,L,M).
r_2stage20(A,B,C,D,E,F) :- ulist(D,reg4,G),ulist(G,C,H),ulist(H,I,J),ulist(J,K,L),ulist(L,M,N),ulist(N,O,P),ulist(P,Q,R),ulist(R,S,T),unifyAll([U,V,W],T),r_subBegin(E,X,Y,Z),r_read_value(input3,A),r_read_value(reg3,B),C is A / B,r_assign(reg4,C,Y,A1),r_notEmpty(A1),r_1stage20(I,K,M,O,Q,S,U,V,W,$(E,F,X,A1)).
r_0stage20(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_0stage20(A,B,C,D,E,F).
r_0stage20(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_0stage20(A,B,C,D,M,N),r_0stage20(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
r_1stage20(A,B,C,reg4,C,D,E,F,G,H,I) :- r_subBegin(H,J,K,L),r_read_value(reg4,A),r_read_value(reg3,B),C is A + B,r_assign(reg4,C,K,M),r_notEmpty(M),r_0stage20(D,E,F,G,$(H,I,J,M)).
r_0stage20(A,B,output,B,C,D) :- r_read_value(reg4,A),B is A / 2,r_assign(output,B,C,D).
r_4stage20(A,B,C,D,$(E,F,G,H)) :- r_subFin(G,H),r_4stage20(A,B,C,D,E,F).
r_4stage20(A,B,C,D,$(E,F,G,H)) :- unifyNext(A,I),unifyNext(B,J),unifyNext(C,K),unifyNext(D,L),r_subNotFin(r_4stage20(A,B,C,D,M,N),r_4stage20(I,J,K,L,$(O,P,Q,R)),$(O,P,Q,R),E,F,G,H).
stage2(A,B) :- r_subBegin(A,C,D,E),r_read_value(input3,F),r_read_value(reg3,G),H is F / G,r_assign(reg4,H,D,I),r_notEmpty(I),r_4stage20(J,K,L,[M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1],$(A,B,C,I)).
last_stage(A,A) :- !,r_read_value(output,B),write(B).
